//
//  HMHomeTableViewController.swift
//  Weibo24
//
//  Created by apple on 17/3/26.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
import YYModel

class HMHomeTableViewController: HMVisitorTableViewController {
  
    //  MARK: ---   懒加载控件
    //  上拉加载视图
    fileprivate lazy var pullUpView: UIActivityIndicatorView = {
        let indicatorView = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
        //  指定颜色
        indicatorView.color = UIColor.red
        return indicatorView
    }()
    //  下拉刷新视图
//    fileprivate lazy var pullDownView: UIRefreshControl = {
//        let refreshCtr = UIRefreshControl()
//        refreshCtr.addTarget(self, action: #selector(pullDownRefreshAction), for: .valueChanged)
//        return refreshCtr
//    }()
    //  自定义下拉刷新控件HMRefreshControl
    fileprivate lazy var pullDownView: HMRefreshControl = {
        let refreshCtr = HMRefreshControl()
        //  添加刷新事件
        refreshCtr.addTarget(self, action: #selector(pullDownRefreshAction), for: .valueChanged)
        return refreshCtr
    }()
    //  tipLabel
    fileprivate lazy var tipLabel: UILabel = {
        let label = UILabel(fontSize: 12, textColor: UIColor.white, text: "没有加载到最新的微博数据")
        label.backgroundColor = UIColor.orange
        label.textAlignment = .center
        //  默认情况下隐藏
        label.isHidden = true
        return label
    }()
    
    //  引用ViewModel
    fileprivate lazy var homeViewModel: HMHomeViewModel = HMHomeViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if !isLogin {
            visitorView?.updateVisitorInfo(imageName: nil, message: nil)
        } else {
            setupUI()
            //  登录成功
            loadData()
        }
    }
    
    fileprivate func setupUI() {
        if let nav = self.navigationController {
            nav.view.insertSubview(tipLabel, belowSubview: nav.navigationBar)
            //  好比oc里面CGRectGetMaxY(frame)获取最大y
            tipLabel.frame = CGRect(x: 0, y: nav.navigationBar.frame.maxY - 35, width: nav.navigationBar.width, height: 35)
        }
        setupTableView()
    }
    
    //  tableView的相关操作
    fileprivate func setupTableView() {
        //  注册cell
        tableView.register(HMHomeTableViewCell.self, forCellReuseIdentifier: HomeCellIdentifier)
        //  设置行高(自动计算行高)
        tableView.rowHeight = UITableViewAutomaticDimension
        //  预估高度,越接近真实高度越好
        tableView.estimatedRowHeight = 200
        //  不显示分割线
        tableView.separatorStyle = .none
        //  设置tableView的footerview
        tableView.tableFooterView = pullUpView
        //  添加下拉刷新1
//        self.refreshControl = pullDownView
        //  添加下拉刷新2
        tableView.addSubview(pullDownView)
        
    }
    
    //  下拉刷新
    @objc private func pullDownRefreshAction() {
        print("下拉刷新要请求数据了...")
        loadData()
        
        
    }
    
    //  tip动画的方法
    fileprivate func tipAnimation(message: String) {
        //  如果正在显示表示在执行动画,然后让其返回
        if tipLabel.isHidden == false {
            return
        }
        //  执行动画显示tipLabel
        tipLabel.isHidden = false
        //  设置最新的显示内容
        tipLabel.text = message
        UIView.animate(withDuration: 1, animations: { 
            self.tipLabel.transform = CGAffineTransform(translationX: 0, y: self.tipLabel.height)
            
        }) { (_) in
            UIView.animate(withDuration: 1, animations: { 
                self.tipLabel.transform = CGAffineTransform.identity
            }, completion: { (_) in
                //  动画执行完成改成不显示
                self.tipLabel.isHidden = true
            })
        }
        
    
    }
    
    //  获取首页数据
    fileprivate func loadData() {
//        HMNetworkTools.sharedTools.requestHomeData(accessToken: HMUserAccountViewModel.sharedViewModel.accessToken!) { (response, error) in
//            if error != nil {
//                print("网络请求异常: \(error!)")
//                return
//            }
//            guard let dic = response as? [String: Any] else {
//                print("数据格式有异常")
//                return
//            }
//            
//            //  代码执行到此,表示数据是没有问题是字典
//            let statusDicArray = dic["statuses"] as! [[String: Any]]
//            //  数组字典转成数组模型
//            //  1. classForCoder 如果能够获取对象的类型,那么这个对象必须有父类最终继承是NSObject
//            //  2. self swift 的使用获取对象的类型的方式,这个类可以没有父类
//            let statusArray = NSArray.yy_modelArray(with: HMStatus.self, json: statusDicArray) as! [HMStatus]
//            //  保存数据源
//            self.statusList = statusArray
//            //  让tableView重新加载数据
//            self.tableView.reloadData()
//        }
        
        homeViewModel.requestHomeData(isPullup: pullUpView.isAnimating) { (isSuccess, message) in
            //  下拉刷新的时候和第一次获取微博数据的时候执行tip动画
            if self.pullUpView.isAnimating == false {
                //  执行tip动画
                self.tipAnimation(message: message)
            }
            
            //  结束刷新
            self.endRefreshing()
            if isSuccess {
                self.tableView.reloadData()
            }
        }
    
    }
    
    //  结束刷新
    fileprivate func endRefreshing() {
        //  停止风火轮
        pullUpView.stopAnimating()
        //  停止下拉刷新
        pullDownView.endRefreshing()
    }
    
}


//  MARK: ---   UITableViewDataSource 实现

extension HMHomeTableViewController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return homeViewModel.statusList.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: HomeCellIdentifier, for: indexPath) as! HMHomeTableViewCell
        //  获取ViewModel模型
        let statusViewModel = homeViewModel.statusList[indexPath.row]
        cell.statusViewModel = statusViewModel
        //  设置选中的样式
        cell.selectionStyle = .none
        return cell
    }
    
    //  监听将要显示的cell
    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        //  1. 滚动到最后一个cell,2. 没有开启动画才能加载更多数据
        if indexPath.row == homeViewModel.statusList.count - 1 && !pullUpView.isAnimating {
            //  滚动到最后一个cell了
            print("滚动到最后一个cell了")
            //  开启风火轮
            pullUpView.startAnimating()
            //  上拉加载更多的数据
            loadData()
        }
    }
}







